package com.service.web.bean;

import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;

/**
 * <p/>
 * <li>Description: 验证注解是否需要加密解密 </li>
 * <li>@author: XiaJunJian </li>
 * <li>@date: 2020-06-09 18:11:39</li>
 */
@Component
public class Crypto {
    /**
     * 是否需要对返回值加密
     *
     * @param type the type
     * @return the boolean
     */
    public boolean encrypt(MethodParameter type) {
        boolean encryptFlag = false;
        // 类上的加密注解
        boolean classPresentAnno = type.getContainingClass().isAnnotationPresent(Encrypt.class);
        // 方法上的加密注解
        boolean methodPresentAnno = type.getMethod().isAnnotationPresent(Encrypt.class);
        if (classPresentAnno) {
            // 类上标注的注解是否需要加密
            encryptFlag = type.getContainingClass().getAnnotation(Encrypt.class).value();
            // 类不需要加密则都不需要加密
            if (!encryptFlag) {
                return false;
            }
        }
        if (methodPresentAnno) {
            // 方法上标注的是否需要加密
            encryptFlag = type.getMethod().getAnnotation(Encrypt.class).value();
        }
        return encryptFlag;
    }

    /**
     * 是否需要对参数解密
     */
    public boolean decrypt(MethodParameter type) {
        boolean decryptFlag = false;
        // 类上的解密注解
        boolean classPresentAnno = type.getContainingClass().isAnnotationPresent(Decrypt.class);
        // 方法上的解密注解
        boolean methodPresentAnno = type.getMethod().isAnnotationPresent(Decrypt.class);
        if (classPresentAnno) {
            // 类上标注的注解是否需要解密
            decryptFlag = type.getContainingClass().getAnnotation(Decrypt.class).value();
            // 类上的注解不需要解密则都不解密
            if (!decryptFlag) {
                return false;
            }
        }
        if (methodPresentAnno) {
            // 方法上标注的是否需要解密
            decryptFlag = type.getMethod().getAnnotation(Decrypt.class).value();
        }
        return decryptFlag;
    }
}
